#ifndef _CUCI_H_
#define _CUCI_H_
#include "uci.h"

/**
* @brief 获取setion的section-type或者option的value
* @param[in] acc_path:需要被访问的位置的路径，<config>.<section>[.<option>]，并且支持节点类型”数组的方式访问，如network.@interface[1]
* @param[out] out_str:读取到的字符串存放位置
* @param[in] str_size_max:读取到字符串存放的缓冲区大小
* @retval UCI_OK:成功 非UCI_OK:失败
*/
int cuci_get(const char *acc_path, char *out_str, size_t str_size_max);

/**
* @brief 设置setion的section-type或者option的value
* @param[in] acc_path:需要被访问的位置的路径，<config>.<section>[.<option>]，并且支持节点类型”数组的方式访问，如network.@interface[1]
* @param[in] set_str:需要写入的字符串
* @note1 如果对应位置为空，则会创建一个新的section或者option；
* @note2 如果对应位置为list，则会替换成option
* @note3 当对应位置有相同值的时候，不会重复写入
* @retval UCI_OK:成功 非UCI_OK:失败
*/
int cuci_set(const char *acc_path, const char *set_str);

/**
* @brief 遍历list
* @param[in] acc_path:需要被访问的位置的路径，<config>.<section>[.<option>]，并且支持节点类型”数组的方式访问，如network.@interface[1]
* @param[in] list_cb:当遍历到字符串后，将通过这个回调函数对字符串进行相应处理
* @param[in] param1_cb:传输给回调函数list_cb的参数
* @retval UCI_OK:成功 非UCI_OK:失败
*/
int cuci_foreach_list(const char *acc_path, void (*list_cb)(char *list_value, void *ret), void *param1_cb);

/**
* @brief 判断list中是否有对应的字符串
* @param[in] acc_path:需要被访问的位置的路径，<config>.<section>.<option>，并且支持节点类型”数组的方式访问，如firewall.@zone[1].network
* @param[in] set_str:需要写入的字符串
* @retval true:找到 false：未找到
*/
bool cuci_is_list_have_str(const char *acc_path, const char *find_str);

/**
* @brief 往list中添加列表值
* @param[in] acc_path:需要被访问的位置的路径，<config>.<section>.<option>，并且支持节点类型”数组的方式访问，如firewall.@zone[1].network
* @param[in] add_str:需要增加的字符串
* @note1 如果对应位置为空，则会创建一个新的list；
* @note2 如果对应位置为option，则会替换成list，并且在list中的首个列表值为原option中的值
* @note3 当对应位置有相同值的时候，不会重复写入
* @retval UCI_OK:成功 非UCI_OK:失败
*/
int cuci_add_list(const char *acc_path, char *add_str);

#endif

